home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mactech.com 2010
/
ftp.mactech.com.tar
/
ftp.mactech.com
/
machack
/
Hacks96
/
FlyPaper.sit
/
Fly Paper
/
FlyPaper Source
/
(Old Sources)
/
ClippingFile.cpp
next >
Wrap
Text File
|
1996-06-22
|
8KB
|
336 lines
/*
** This file is for creating and using Finder clipping files. Note that the Finder gets
** pretty pissed if the clipping type is one other than it would create itself.
**
*/
#ifndef CLIPPINGFILE_H
#include "ClippingFile.h"
#endif
#ifndef FLYPAPERUTILS_H
#include "FlyPaperUtils.h"
#endif
#include "ST_MacClasses.h"
#include <folders.h>
#include <TextUtils.h>
DragSendDataUPP gMySendDataProc;
OSErr CreateClippingFile (short *fRefNum, OSType fileType, FlyPaperAuxDataHandle& auxData, ClippingID& clippingID)
{
ST_ResFileSaver resFileSaver (CurResFile ());
*fRefNum = 0;
static Boolean initedRandom = false;
long dirID;
short vRefNum;
OSErr error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &vRefNum, &dirID);
if (error)
return error;
if (!initedRandom) {
GetDateTime ((unsigned long*) &qd.randSeed);
initedRandom = true;
}
Str255 name;
do {
/* create a unique name */
do {
clippingID = ((long) Random () + ((long) Random () << 16)) & 0x7FFFFFFF;
} while (clippingID < 256);
NumToString (clippingID, name);
error = HCreate (vRefNum, dirID, name, kClippingFileSignature, fileType);
} while (error == dupFNErr);
if (error)
return error;
HCreateResFile (vRefNum, dirID, name);
short resFile = HOpenResFile (vRefNum, dirID, name, fsRdWrPerm);
if (resFile < 0) {
CloseResFile (resFile);
HDelete (vRefNum, dirID, name);
return fnfErr;
}
/* create the 'drag' resource header */
UseResFile (resFile);
DragResourceHeader header = (DragResourceHeader) NewHandle (sizeof (DragResourceHeaderRec));
if (!header) {
CloseResFile (resFile);
HDelete (vRefNum, dirID, name);
return memFullErr;
}
(**header).version = 0x00000001;
(**header).reserved1 = 0;
(**header).reserved2 = 0;
(**header).reserved3 = 0;
(**header).flavorCount = 0;
AddResource ((Handle) header, kDragResourceResType, kDragResourceResID, "\p");
error = ResError ();
if (error) {
CloseResFile (resFile);
DisposeHandle ((Handle) header);
HDelete (vRefNum, dirID, name);
return error;
}
/* create the special FlyPaper data */
auxData = (FlyPaperAuxDataHandle) NewHandle (sizeof (FlyPaperAuxDataRec));
if (!auxData) {
CloseResFile (resFile);
HDelete (vRefNum, dirID, name);
return memFullErr;
}
AddResource ((Handle) auxData, kAuxDataResType, kAuxDataResID, name);
error = ResError ();
if (error) {
CloseResFile (resFile);
HDelete (vRefNum, dirID, name);
return error;
}
*fRefNum = resFile;
return noErr;
}
OSErr AddFlavorToClippingFile (short clippingRefNum, FlavorType flavorType, Handle flavorData)
{
ST_ResFileSaver resFileSaver (CurResFile ());
UseResFile (clippingRefNum);
DragResourceHeader header = (DragResourceHeader)
Get1Resource (kDragResourceResType, kDragResourceResID);
if (!header)
return resNotFound;
DragResourceFlavorRec flavorRec;
flavorRec.flavorType = flavorType;
flavorRec.reserved1 = 0x00000100;
flavorRec.reserved2 = 0x00000000;
flavorRec.reserved3 = 0x00000000;
AddResource (flavorData, flavorType, kFlavorResID, "\p");
OSErr error = ResError ();
if (error)
return error;
error = PtrAndHand (&flavorRec, (Handle) header, sizeof (flavorRec));
if (error)
return error;
(**header).flavorCount++;
ChangedResource ((Handle) header);
return noErr;
}
OSErr OpenClippingFile (ClippingID id, short& fileRef)
{
fileRef = 0;
FSSpec spec;
OSErr error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &spec.vRefNum,
&spec.parID);
if (error)
return error;
NumToString (id, spec.name);
ST_ResFileSaver resSaver (CurResFile ());
fileRef = FSpOpenResFile (&spec, fsCurPerm);
if (fileRef < 0)
return ResError ();
else
return noErr;
}
OSErr GetClippingFileAuxData (ClippingID id, FlyPaperAuxDataHandle& data)
{
short fileRef = 0;
ST_ResFileSaver resFileSaver (CurResFile ());
OSErr error = OpenClippingFile (id, fileRef);
if (error)
return error;
ST_ResFileCloser resFileCloser (fileRef);
UseResFile (fileRef);
data = (FlyPaperAuxDataHandle) Get1Resource (kAuxDataResType, kAuxDataResID);
if (!data)
return resNotFound;
DetachResource ((Handle) data);
return noErr;
}
OSErr DeleteClippingFile (ClippingID id)
{
FSSpec spec;
OSErr error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true, &spec.vRefNum,
&spec.parID);
if (error)
return error;
NumToString (id, spec.name);
return FSpDelete (&spec);
}
OSErr ClippingFileToDragReference (ClippingID id, DragReference& dragRef, Boolean loadit)
{
ST_ResFileSaver resFileSaver (CurResFile ());
short fileRef;
OSErr error = OpenClippingFile (id, fileRef);
if (error)
return error;
ST_ResFileCloser resFileCloser (fileRef);
UseResFile (fileRef);
DragResourceHeader header = (DragResourceHeader) Get1Resource (kDragResourceResType, kDragResourceResID);
if (!header)
return resNotFound;
error = NewDrag (&dragRef);
if (error)
return error;
ST_DragReference theDragRef (dragRef);
if (!loadit) {
error = SetDragSendProc (dragRef, gMySendDataProc, 0);
if (error)
return error;
}
for (unsigned short whichFlavor = 0; whichFlavor < (**header).flavorCount; ++whichFlavor) {
FlavorType flavor;
Handle flavorHandle;
flavor = (**header).flavors [whichFlavor].flavorType;
if (loadit) {
// TempGet1Resource returns a tempmem handle, not a resource handle
ST_Handle flavorHandle = TempGet1Resource (flavor, kFlavorResID);
if ((Handle) flavorHandle == nil) {
return resNotFound;
}
error = AddDragItemFlavor (dragRef, (ItemReference) id, flavor, *(Handle)flavorHandle,
GetHandleSize ((Handle) flavorHandle), 0);
if (error)
return error;
} else
return memFullErr;
#if 0 // Doesn't seem to work if I am bg-only. :-( error -600
else {
error = AddDragItemFlavor (dragRef, (ItemReference) id, flavor, nil, 1, 0);
if (error)
return error;
}
#endif
}
if (error == noErr) {
theDragRef.Forget ();
return noErr;
} else {
return error;
}
}
OSErr ExtractFlavorFromClippingFile (ClippingID id, FlavorType whichFlavor, Handle &outHandle)
{
ST_ResFileSaver resFileSaver (CurResFile ());
short fileRef;
OSErr error = OpenClippingFile (id, fileRef);
if (error)
return error;
ST_ResFileCloser resFileCloser (fileRef);
UseResFile (fileRef);
DragResourceHeader header = (DragResourceHeader) Get1Resource (kDragResourceResType, kDragResourceResID);
if (!header)
return resNotFound;
unsigned short index;
for (index = 0; index < (**header).flavorCount; ++index) {
if ((**header).flavors [index].flavorType == whichFlavor)
break;
}
if (index == (**header).flavorCount)
return cantGetFlavorErr;
outHandle = TempGet1Resource (whichFlavor, kFlavorResID); // not a resource handle
if (outHandle == 0)
return memFullErr;
else {
return noErr;
}
}
static
pascal OSErr ClippingSendDataProc (FlavorType theType, void *dragSendRefCon, ItemReference theItemRef,
DragReference theDragRef)
{
long oldA5 = SetA5 ((long) dragSendRefCon);
Handle data;
OSErr error = ExtractFlavorFromClippingFile ((ClippingID) theItemRef, theType, data);
if (error)
goto Exit;
long size = GetHandleSize (data);
HLock (data);
error = SetDragItemFlavorData (theDragRef, theItemRef, theType, *data, size, 0);
DisposeHandle (data);
Exit:
SetA5 (oldA5);
return error;
}
Boolean InitClippingFile (void)
{
gMySendDataProc = NewDragSendDataProc (ClippingSendDataProc);
if (!gMySendDataProc)
return false;
else
return true;
}